import matplotlib.pyplot as plt
import numpy as np
import random
from matplotlib import rcParams

# 设置中文字体为 SimHei 或者 Microsoft YaHei
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体字体来显示中文
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 作物数据
crops = ['黄豆', '黑豆', '红豆', '绿豆', '小麦', '玉米', '谷子', '高粱', '荞麦', '南瓜', '红薯', '大麦']
yield_data = [400, 500, 400, 350, 800, 1000, 400, 630, 110, 3000, 2200, 525]  # 亩产量
cost_data = [400, 400, 350, 350, 450, 500, 360, 400, 350, 1000, 2000, 350]  # 种植成本
price_data_min = [2.50, 6.50, 7.50, 6.00, 3.00, 2.50, 6.00, 5.50, 30.00, 1.00, 2.50, 3.00]  # 销售价格最小值
price_data_max = [4.00, 8.50, 9.00, 8.00, 4.00, 3.50, 7.50, 6.50, 50.00, 2.00, 4.00, 4.00]  # 销售价格最大值

# 假设亩产量有 ±10% 的波动，种植成本有 5% 增长并有 ±2% 的波动
yield_uncertainty = 0.10
cost_growth = 0.05
cost_uncertainty = 0.02

# 打乱作物及其相关数据的顺序
data = list(zip(crops, yield_data, cost_data, price_data_min, price_data_max))
random.shuffle(data)  # 随机打乱顺序
crops, yield_data, cost_data, price_data_min, price_data_max = zip(*data)  # 解压缩数据

x = np.arange(len(crops))

# 创建图形
fig, ax1 = plt.subplots(figsize=(12, 6))

# 设置新的图形风格：更柔和的色彩和更简洁的背景
fig.patch.set_facecolor('#f0f4f7')  # 整体背景色
ax1.set_facecolor('#dce4e7')  # 图表区域背景色

# 使用新的颜色搭配来绘制图形
ax1.bar(x - 0.2, yield_data, width=0.4, label='亩产量 (斤/亩)', color='#b56576', edgecolor='black', yerr=[y * yield_uncertainty for y in yield_data], capsize=5)
ax1.bar(x + 0.2, cost_data, width=0.4, label='种植成本 (元/亩)', color='#6d597a', edgecolor='black', yerr=[c * cost_uncertainty for c in cost_data], capsize=5)

# 设置左侧 y 轴标签
ax1.set_ylabel('亩产量 (斤/亩) 和 种植成本 (元/亩)', fontsize=12)

# 设置 x 轴标签和刻度
ax1.set_xticks(x)
ax1.set_xticklabels(crops, rotation=45, ha="right", fontsize=12)

# 创建第二个 y 轴用于显示销售价格，使用新的线条样式和颜色
ax2 = ax1.twinx()
ax2.errorbar(x, [(min_val + max_val) / 2 for min_val, max_val in zip(price_data_min, price_data_max)],
             yerr=[(max_val - min_val) / 2 for min_val, max_val in zip(price_data_min, price_data_max)],
             fmt='o-', color='#355070', label='销售价格 (元/斤)', capsize=5, linestyle='--', linewidth=2)

# 设置右侧 y 轴标签
ax2.set_ylabel('销售价格 (元/斤)', fontsize=12)

# 添加网格线，使用点状样式
ax1.grid(True, linestyle=':', alpha=0.7)

# 设置图例位置
fig.legend(loc='upper left', bbox_to_anchor=(0.1, 1), bbox_transform=ax1.transAxes)

# 添加图形标题
plt.title('几种作物的亩产量、种植成本和销售价格 (含波动范围)', fontsize=16, weight='bold')

# 显示图形
plt.tight_layout()
plt.show()
